#include<iostream>
#include<string>
#include<vector>
#include<boost/filesystem.hpp>
#include"log.hpp"
#include"util.hpp"


const std::string src_path = "data/input/";
const std::string output = "data/raw_path/raw.txt";
//这是一个目录,下面存放的是所有的html网页
typedef struct DocInfo{
    std::string title;//文档的标题
    std::string content; //文档的内容
    std::string url;//改文档在官网中的url
}DocInfo_t;
//列出文件列表
bool EnumFile(const std::string src_path, std::vector<std::string> *file_list);
//解析文件
bool ParseUtil(const std::vector<std::string>& file_list, std::vector<DocInfo_t>* results);
//存放文件地方
bool SaveHtml(const std::vector<DocInfo_t>& result, const std::string& output);




int main()
{
    std::vector<std::string> file_list;
    //第一步递归的把每个html文件名带路径,保存到file_list中, 方便后期进行一个一个文件读取
    if(!EnumFile(src_path, &file_list))
    {
        std::cerr<<"error enumfile !"<<std::endl;
        return 1;
    }
    //第二步:按照file_list读取每个文件内容,并进行解析
    std::vector<DocInfo_t> results;
    if(!ParseUtil(file_list, &results))
    {
        std::cerr<<"error ParseUtil !"<<std::endl;
        return 2;
    }
    //第三步:解析完毕的各个文件内容,写入output, 按照\3作为每个文件的分割符
    if(!SaveHtml(results, output))
    {
        std::cerr<<"save html error"<<std::endl;
        return 3;
    }
    return 0;
}



bool EnumFile(const std::string src_path, std::vector<std::string> *file_list)
{
    namespace fs = boost::filesystem;
    fs::path root_path(src_path);
    if(fs::exists(root_path))
    {
        std::cerr<< src_path << " not exits " << std::endl;
        return false;
    }
    //定义一个空的迭代器, 用来判断;递归是否结束
    fs::recursive_directory_iterator end;
    for(fs::recursive_directory_iterator iter(root_path); iter != end; iter++)
    {
        //判断文件是否存在, 若不存在, 就没有必要向后走
        if(!fs::is_regular_file(*iter))
        {
            continue;
        }
        //判断文件路径名的后缀是否符合要求
        if(iter->path().extension() != ".html")
        {
            continue;
        }
        file_list->push_back(iter->path().string());//将所有带路径的html保存在file_list中方便后续进行文本分析
    }
    return true;
}

static bool ParseTitle(const std::string& file, std::string* title)
{
    std::size_t begin = file.find("<title>");
    if(begin == std::string::npos)
    {
        return false;
    }
    std::size_t end = file.find("</title>");
    if(end = std::string::npos)
    {
        return false;
    }
    begin += std::string("<title>").size();
    if(begin > end)
    {
        return false;
    }
    *title = file.substr(begin, end - begin);
    return true;
}
static bool ParseContent(const std::string& file, std::string* content)
{
    //去标签, 基于一个简单的状态机
    enum status{
        LABLE,
        CONTENT
    };
    enum status s = LABLE;
    
}
static bool ParsePath(const std::string& file_path, std::string* url)
{

}
bool ParseUtil(const std::vector<std::string>& file_list, std::vector<DocInfo_t>* results)
{
    for(const std::string & file : file_list)
    {
        //1. 读取文件，Read()
        std::string result;
        if(!ns_util::FileUtil::ReadFile(file, &result))
        {
            continue;
        }
        DocInfo_t doc;
        //2. 解析指定的文件, 提取title
        if(!ParseTitle(result, &doc.title))
        {
            continue;
        }
        //3. 解析指定文件, 提取content, 去标签
        if(!ParseContent(result, &doc.content))
        {
            continue;
        }
        //4. 解析指定文件路径, 构建url
        if(!ParsePath(file, &doc.url))
        {
            continue;
        }
        //done, 一定是完成了解析任务, 当前文档的结果都保存在doc里面
        results->push_back(std::move(doc));// bug: todo 细节本质都发生拷贝, 效率可能发生比较低
    }
    return true;
}